﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml.Spreadsheet;
using Citi.Helpers.Extensions;
using System.Data;

namespace Citi.OTFPC.Pep.Domain
{
    public class PepInput
    {
        public string ProjectNumber { get; set; }
        public string Business { get; set; }
        public string ProjectManager { get; set; }
        public DateTime? End { get; set; }
        public DateTime? Start { get; set; }
        public string Status { get; set; }
        public string Entity { get; set; }
        public string ExpenseCode { get; set; }
        public string Branch { get; set; }
        public decimal USDRate { get; set; }
        public decimal InvestimentAmount { get; set; }

        public static PepInput LoadCustomers(DataRow row)
        {
            try
            {
                var textArray = row.ItemArray.Select(x => x != null ? x.ToString() : string.Empty).ToList();

                if (textArray.Count() > 1 && textArray.Any(x => x != string.Empty))
                {
                    var pep = new PepInput
                    {
                        ProjectNumber = textArray[0].Replace("CEP", "PEP"),
                        Business = textArray[1],
                        ProjectManager = textArray[2],
                        Status = textArray[4],
                        Entity = Convert.ToInt64(textArray[7]).ToString(),
                        ExpenseCode = textArray[8],
                        Branch = Convert.ToInt64(textArray[9]).ToString(),
                    };

                    decimal value;

                    if (!string.IsNullOrEmpty(textArray[21]) && decimal.TryParse(textArray[21], out value))
                        pep.USDRate = value;

                    if (!string.IsNullOrEmpty(textArray[22]) && decimal.TryParse(textArray[22], out value))
                        pep.InvestimentAmount = value;

                    DateTime date;

                    if (!string.IsNullOrEmpty(textArray[16]) && DateTime.TryParse(textArray[16], out date))
                        pep.Start = date;

                    if (!string.IsNullOrEmpty(textArray[3]) && DateTime.TryParse(textArray[3], out date))
                        pep.End = date;

                    return pep;
                }
                else
                {
                    return null;
                }
            }
            catch
            {
                return null;
            }
        }

        public static List<PepInput> LoadCustomers(Worksheet worksheet, SharedStringTable sharedString)
        {
            var result = new List<PepInput>();
            var dataRows = worksheet.Descendants<Row>().Where(row => row.RowIndex > 2).ToList();

            var headers = dataRows.First().Descendants<Cell>().Where(cell => cell.CellValue != null)
                                    .Select(cell => cell.DataType != null && cell.DataType.HasValue && cell.DataType == CellValues.SharedString
                                    ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
                                    : cell.CellValue.InnerText);

            dataRows.RemoveAt(0);

            foreach (Row row in dataRows)
            {
                try
                {
                    var textArray = row.Elements<Cell>().Select(cell => cell.DataType != null && !cell.DataType.HasValue
                            ? string.Empty
                                : cell.DataType != null && cell.DataType.HasValue && cell.DataType == CellValues.SharedString
                                    ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
                                    : cell.CellValue == null ? string.Empty : cell.CellValue.InnerText).ToList();

                    if (textArray.Count() > 1)
                    {
                        var pep = new PepInput
                        {
                            ProjectNumber = textArray[0].Replace("CEP", "PEP"),
                            Business = textArray[1],
                            ProjectManager = textArray[2],
                            Status = textArray[4],
                            Entity = textArray[7],
                            ExpenseCode = textArray[8],
                            Branch = textArray[9],
                            USDRate = decimal.Parse(textArray[21].Replace(".", ",")),
                            InvestimentAmount = decimal.Parse(textArray[22].Replace(".", ",")),
                        };

                        if (!string.IsNullOrEmpty(textArray[16]))
                            pep.Start = FromExcelSerialDate(int.Parse(textArray[16]));

                        if (!string.IsNullOrEmpty(textArray[3]))
                            pep.End = FromExcelSerialDate(int.Parse(textArray[3]));

                        result.Add(pep);
                    }
                    else
                    {
                        break;
                    }
                }
                catch
                {
                    continue;
                }
            }

            return result;

        }


        //public static List<PepInput> LoadCustomers(Worksheet worksheet, SharedStringTable sharedString)
        //{
        //    var result = new List<PepInput>();
        //    var dataRows = worksheet.Descendants<Row>().Where(row => row.RowIndex > 1).ToList();
        //    dataRows.RemoveRange(0, 5);

        //    foreach (Row row in dataRows)
        //    {
        //        try
        //        {
        //            var textValues = row.Descendants<Cell>().Where(cell => cell.CellValue != null)
        //                             .Select(cell => cell.DataType != null && cell.DataType.HasValue && cell.DataType == CellValues.SharedString
        //                             ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
        //                             : cell.CellValue.InnerText);

        //            if (textValues.Count() > 0)
        //            {
        //                var textArray = textValues.ToArray();

        //                var pep = new PepInput
        //                {
        //                    ProjectNumber = textArray[0].Replace("CEP", "PEP"),
        //                    Business = textArray[1],
        //                    ProjectManager = textArray[2],
        //                    Status = textArray[17],
        //                    Entity = textArray[5],
        //                    ExpenseCode = textArray[6],
        //                    Branch = textArray[7],
        //                    USDRate = decimal.Parse(textArray[8]),
        //                    InvestimentAmount = decimal.Parse(textArray[9]),
        //                };

        //                if (!string.IsNullOrEmpty(textArray[15]))
        //                    pep.Start = FromExcelSerialDate(int.Parse(textArray[15]));

        //                if (!string.IsNullOrEmpty(textArray[16]))
        //                    pep.End = FromExcelSerialDate(int.Parse(textArray[16]));

        //                result.Add(pep);
        //            }
        //            else
        //            {
        //                break;
        //            }
        //        }
        //        catch
        //        {
        //            continue;
        //        }
        //    }

        //    return result;

        //}

        public static DateTime FromExcelSerialDate(int serialDate)
        {
            if (serialDate > 59) serialDate -= 1;
            return new DateTime(1899, 12, 31).AddDays(serialDate);
        }
    }
}